package org.asiainfo.system.service;

import org.asiainfo.common.mybatis.stream.core.page.TableDataInfo;
import org.asiainfo.common.mybatis.stream.core.page.PageQuery;

import java.util.Collection;
import java.util.List;
import java.util.Set;

import org.asiainfo.system.domain.bo.SysUserBo;
import org.asiainfo.system.domain.bo.SysUserRoleBo;
import org.asiainfo.system.domain.vo.SysRoleVo;
import org.asiainfo.system.domain.bo.SysRoleBo;
import org.asiainfo.system.domain.SysRole;
import com.mybatisflex.core.service.IService;
import org.asiainfo.system.domain.vo.SysUserVo;

/**
 * 角色信息表Service接口
 *
 * @author dotor-ww
 * @since 2024-01-15 21:17:26
 */
public interface SysRoleService extends IService<SysRole> {

    /**
     * 通过roleId查询单条数据
     *
     * @param roleId 主键
     * @return 实例对象
     */
    SysRoleVo queryById(Long roleId);

    /**
     * 查询
     *
     * @param sysRoleBo 筛选条件
     * @return 查询结果
     */
    List<SysRoleVo> queryList(SysRoleBo sysRoleBo);

    /**
     * 分页查询
     *
     * @param sysRoleBo 筛选条件
     * @param pageQuery 分页对象
     * @return 查询结果
     */
    TableDataInfo<SysRoleVo> queryPageList(SysRoleBo sysRoleBo, PageQuery pageQuery);

    /**
     * 新增数据
     *
     * @param sysRoleBo 实例对象
     * @return 实例对象
     */
    Boolean insertByBo(SysRoleBo sysRoleBo);

    /**
     * 修改数据
     *
     * @param sysRoleBo 实例对象
     */
    Boolean updateByBo(SysRoleBo sysRoleBo);

    /**
     * 通过主键删除数据
     *
     * @param roleIds 主键
     */
    Boolean deleteWithValidByIds(Collection<Long> roleIds);

    /**
     * 校验角色数据权限
     *
     * @param roleId 角色ID
     */
    void checkRoleDataScope(Long roleId);

    /**
     * 校验角色是否允许操作
     *
     * @param sysRoleBo 角色信息
     */
    void checkRoleAllowed(SysRoleBo sysRoleBo);

    /**
     * 校验角色名称是否唯一
     *
     * @param sysRoleBo 角色信息
     * @return 校验结果
     */
    Boolean checkRoleNameUnique(SysRoleBo sysRoleBo);

    /**
     * 校验角色权限是否唯一
     *
     * @param sysRoleBo 角色信息
     * @return 校验结果
     */
    Boolean checkRoleKeyUnique(SysRoleBo sysRoleBo);

    /**
     * 角色状态更新
     *
     * @param sysRoleBo 角色信息
     * @return 更新结果
     */
    Boolean updateRoleStatusByRoleId(SysRoleBo sysRoleBo);

    /**
     * 查询角色使用数量
     *
     * @param roleId 角色ID
     * @return 查询结果
     */
    Long countUserRoleByRoleId(Long roleId);

    /**
     * 获取角色选择框列表
     *
     * @return 下拉结果
     */
    List<SysRoleVo> optionSelect();

    /**
     * 查询已分配的角色列表
     *
     * @param sysUserBo 用户信息
     * @param pageQuery 分页信息
     * @return 查询结果
     */
    TableDataInfo<SysUserVo> selectAllocatedList(SysUserBo sysUserBo, PageQuery pageQuery);

    /**
     * 查询未分配的角色列表
     *
     * @param sysUserBo 用户信息
     * @param pageQuery 分页信息
     * @return 查询结果
     */
    TableDataInfo<SysUserVo> selectUnAllocatedList(SysUserBo sysUserBo, PageQuery pageQuery);

    /**
     * 取消授权
     *
     * @param sysUserRoleBo 用户角色关联信息
     * @return 操作结果
     */
    Boolean removeAuthUser(SysUserRoleBo sysUserRoleBo);

    /**
     * 批量取消授权
     *
     * @param roleId  角色ID
     * @param userIds 用户ID
     * @return 操作结果
     */
    Boolean removeAuthUsers(Long roleId, Long[] userIds);

    /**
     * 清除在线用户
     *
     * @param roleId 角色ID
     */
    void cleanOnlineUserByRoleId(Long roleId);

    /**
     * 批量选择用户
     *
     * @param roleId  角色ID
     * @param userIds 用户ID
     * @return 操作结果
     */
    int insertAuthUsers(Long roleId, Long[] userIds);

    /**
     * 修改角色数据权限
     *
     * @param sysRoleBo 角色信息
     * @return 操作结果
     */
    Boolean authDataScope(SysRoleBo sysRoleBo);

    /**
     * 根据用户ID查询角色
     *
     * @param userId 用户ID
     * @return 查询结果
     */
    List<SysRoleVo> selectRolesByUserId(Long userId);

    /**
     * 根据用户ID查询角色列表(包含授权)
     *
     * @param userId 用户ID
     * @return 查询结果
     */
    List<SysRoleVo> selectRolesAuthByUserId(Long userId);

    /**
     * 根据用户ID查询角色权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> selectRolePermissionByUserId(Long userId);

    /**
     * 根据用户ID查询角色列表
     *
     * @param userId 用户ID
     * @return 查询结果
     */
    List<Long> selectRoleListByUserId(Long userId);

    /**
     * 根据条件查询角色信息
     *
     * @param sysRoleBo 角色信息
     * @return 角色数据集合
     */
    List<SysRoleVo> selectRoleList(SysRoleBo sysRoleBo);

    /**
     * 查询所有角色列表
     *
     * @return 角色列表
     */
    List<SysRoleVo> selectRoleAll();
}
